/**
 ******************************************************************************
 * @file    USART/USART_Printf/main.c
 * @author  MCD Application Team
 * @version V1.0.0
 * @date    30-September-2011
 * @brief   Main program body
 ******************************************************************************
 * @attention
 *
 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
 *
 * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
 ******************************************************************************
 */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
#include "usart_debug.h"
#include "usr_wifi232_a.h"
#include <stdio.h>

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/

static __IO uint32_t TimingDelay;


/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

/**
 * @brief  Main programs
 * @param  None
 * @retval None
 */
int main(void) {
	/*!< At this stage the microcontroller clock setting is already configured,
	 this is done through SystemInit() function which is called from startup
	 file (startup_stm32f4xx.s) before to branch to application main.
	 To reconfigure the default setting of SystemInit() function, refer to
	 system_stm32f4xx.c file
	 */

	/* Setup SysTick Timer for 1 msec interrupts.
	 ------------------------------------------
	 1. The SysTick_Config() function is a CMSIS function which configure:
	 - The SysTick Reload register with value passed as function parameter.
	 - Configure the SysTick IRQ priority to the lowest value (0x0F).
	 - Reset the SysTick Counter register.
	 - Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
	 - Enable the SysTick Interrupt.
	 - Start the SysTick Counter.

	 2. You can change the SysTick Clock source to be HCLK_Div8 by calling the
	 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
	 SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
	 inside the misc.c file.

	 3. You can change the SysTick IRQ priority by calling the
	 NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function
	 call. The NVIC_SetPriority() is defined inside the core_cm3.h file.

	 4. To adjust the SysTick time base, use the following formula:

	 Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s)

	 - Reload Value is the parameter to be passed for SysTick_Config() function
	 - Reload Value should not exceed 0xFFFFFF
	 */

	int8_t ipAddress[16];

	SysTick_Config(SystemCoreClock / 1000);
	/* Init USART DEBUG */
	usartDebugConfiguration();
	/* Init USART WIFI */
	WifiConfiguration();

	STM_EVAL_LEDInit(LED4);
	STM_EVAL_LEDToggle(LED4);

	printf("\r\nUSR-Wifi232-A module\r\n");

	/*
	 * Set wifi module as Client, we do 4 steps below:
	 * 1. Active module.
	 * 2. Set STA mode.
	 * 3. Connect to server.
	 * 4. Set transmission mode.
	 * 5. Restart module.
	 */
	/* 1. Active module. */

	//activeModule();

	/* 2. Set STA mode. */
	//setSTAMode("MyHouse", "WPA2PSK", "AES", "06031987");

	/* 3. Connect to server.*/
	//connectServer("192.168.0.101", "8899");

	/* 4. Set transmission mode */
	//setTransmissionMode(TRANSPARENT_TRANSMISSION);

	/* Restart module */
	//restart();

	activeModule();
	/* get Ip address */
	getIPaddress(ipAddress);
	//Listen(ipAddress, "8899");
	connectServer("192.168.0.101", "8899");
	restart();

	/* waiting 20s-30s for init hardware*/

	for (int i = 0; i <= 30; i++) {
		printf("\rInit hardware %02us", 30 - i);
		Delay(1000);
	}
	uint32_t time = 0x00;
	int8_t ipAddressPartner[32];
	int8_t dataRecv[512];
	//printf("length buffer: %u\r\n", bufferLength());
	while (1) {
		dataRecv[0] ='\0';
		ipAddressPartner[0] = '\0';
		printf("\r\nnumber %u\r\n", time++);
		sendDataTransparentMode("ABCDEF", (char*) ipAddress);
		//getDataTransparentMode(dataRecv, ipAddressPartner);
		//printf("data received: %s from %s\r\n", dataRecv, ipAddressPartner);
		Delay(2000);


	}
}

/**
 * @brief  Inserts a delay time.
 * @param  nTime: specifies the delay time length, in milliseconds.
 * @retval None
 */
void Delay(__IO uint32_t nTime) {
	TimingDelay = nTime;

	while (TimingDelay != 0)
		;
}

/**
 * @brief  Decrements the TimingDelay variable.
 * @param  None
 * @retval None
 */
void TimingDelay_Decrement(void) {
	if (TimingDelay != 0x00) {
		TimingDelay--;
	}
}

#ifdef  USE_FULL_ASSERT

/**
 * @brief  Reports the name of the source file and the source line number
 *         where the assert_param error has occurred.
 * @param  file: pointer to the source file name
 * @param  line: assert_param error line source number
 * @retval None
 */
void assert_failed(uint8_t* file, uint32_t line)
{
	/* User can add his own implementation to report the file name and line number,
	 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

	/* Infinite loop */
	while (1)
	{
	}
}
#endif

/**
 * @}
 */

/**
 * @}
 */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
